package Test;

public class FatherChildConstructor {
    public static void main(String[] args) {
        System.out.println("-----------------------------------------------------------------");
        System.out.println("Father fatherFather = new Father();");
        Father fatherFather = new Father();
        System.out.println(fatherFather.x);

        System.out.println("-----------------------------------------------------------------");
        System.out.println("Son sonSon = new Son();");
        Son sonSon = new Son();
        System.out.println(sonSon.x);

        System.out.println("-----------------------------------------------------------------");
        System.out.println("Father fatherSon = new Son();");
        Father fatherSon = new Son();
        System.out.println(fatherSon.x);
        System.out.println("-----------------------------------------------------------------");
    }
}

class Father {
    int x = 10;

    public Father() {
        this.print();
        x = 20;
    }
    public void print() {
        System.out.println("Father.x = " + x);
    }
}

class Son extends Father {
    int x = 30;

    public Son() {
        this.print();
        x = 40;
    }
    public void print() {
        System.out.println("Son.x = " + x);
    }
}
//第一个程序  对象转型+继承
//        第一部分
//①创建父类对象前，调用本身的构造方法，并且输出print方法——内容是打印局部变量~x=10，int x初始化为20
//②创建完成后使用.操作符访问局部变量x，此时已初始化为20，则结果为20
////重点是创建对象前x的值是10，,初始化后x的值是20
//
//        第二部分
//①创建子类对象前，隐性调用父类的构造方法，此时的print方法是重写父类的方法，Father.x变为Son.x，但由于x值未初始化则打印为0
//②Son初始化完成后，调用print方法，此时使用局部变量x=30，则结果为30
//③创建完成后使用.操作符访问局部变量x，此时已初始化为40，则结果为40
////重点是子类对象中包含父类的重写方法时，要先调用父类的构造方法初始化，但使用的是子类的属性，随后将子类的构造方法初始化，使用子类的属性
//
//        第三部分
//①调用本身的构造方法：初始化子类重写的方法，但未得到子类的变量——因此打印为0
//②初始化子类的局部变量x=30 重新调用print方法 打印为30 并将x=30改为自己的变量x=20
//③使用·操作符访问本身的已被初始化的x=20 则结果为20
////重点是第一次初始化子类的方法 第二次初始化子类的变量 第三次是创建对象后初始化为自身的变量